package com.eudon.genius.api.core.dto;

import lombok.Data;

import java.util.List;

/**
 * API接口元信息
 *
 * @author eudon
 * @see com.eudon.genius.api.core.dto.ApiInfo.Parameter
 * @see com.eudon.genius.api.core.dto.ApiInfo.Return
 * @since 2025/9/25
 */
@Data
public class ApiInfo {
    /**
     * 接口名称
     */
    private String apiName;

    /**
     * 接口描述
     */
    private String apiDesc;

    /**
     * 接口访问路径
     */
    private String apiUrl;

    /**
     * HTTP请求方法 (GET, POST, PUT, DELETE等)
     */
    private String httpMethod;

    /**
     * 接口请求参数
     */
    private List<Parameter> parameters;

    /**
     * 接口返回参数
     */
    private Return _return;

    /**
     * API参数信息
     */
    @Data
    public static class Parameter {
        /**
         * 参数名称
         */
        private String parameterName;

        /**
         * 参数描述
         */
        private String parameterDesc;

        /**
         * 参数类型 (完整类名)
         */
        private String parameterType;

        /**
         * 参数简单类型名称
         */
        private String simpleTypeName;

        /**
         * 参数是否可空
         */
        private Boolean nullable = true;

        /**
         * 参数位置 (PATH, QUERY, BODY, HEADER等)
         */
        private ParameterLocation location = ParameterLocation.QUERY;

        /**
         * 是否为基本类型 (String, Integer, Long等)
         */
        private Boolean isPrimitive = false;

        /**
         * 嵌套字段 (当参数为复杂对象时)
         */
        private List<Parameter> fields;

        /**
         * 默认值
         */
        private String defaultValue;

        /**
         * 示例值
         */
        private String example;
    }

    /**
     * API返回值信息
     */
    @Data
    public static class Return {
        /**
         * 返回参数名称
         */
        private String returnName;

        /**
         * 返回参数描述
         */
        private String returnDesc;

        /**
         * 返回参数类型 (完整类名)
         */
        private String returnType;

        /**
         * 返回参数简单类型名称
         */
        private String simpleTypeName;

        /**
         * 是否为基本类型
         */
        private Boolean isPrimitive = false;

        /**
         * 嵌套字段 (当返回值为复杂对象时)
         */
        private List<Parameter> fields;
    }

    /**
     * 参数位置枚举
     */
    public enum ParameterLocation {
        /**
         * 路径参数 @PathVariable
         */
        PATH,

        /**
         * 查询参数 @RequestParam
         */
        QUERY,

        /**
         * 请求体 @RequestBody
         */
        BODY,

        /**
         * 请求头 @RequestHeader
         */
        HEADER,

        /**
         * Cookie @CookieValue
         */
        COOKIE,

        /**
         * 表单参数
         */
        FORM
    }
}
